-
Notifications
You must be signed in to change notification settings - Fork 50
[FIX] Preserve user baggage header when setting Session ID #1016
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[FIX] Preserve user baggage header when setting Session ID #1016
Conversation
| } | ||
| } | ||
| return result; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The encoding is custom since baggage headers support characters that would otherwise be escaped by functions like encodeURIComponent.
The logic is:
- Converts the character to an iterable
utf8buffer - Converts each byte value to a hexadecimal string using
toString(16) - Pads it to always have two digits with
padStart(2, '0') - Uppercases it for canonical form.
- Prefixes it with %.
For example, if you encode "é":
Buffer.from('é', 'utf8') -> [195, 169] (0xC3, 0xA9)
result -> %C3%A9
d0408fe to
6007a26
Compare
...es/core/src/rum/instrumentation/resourceTracking/requestProxy/XHRProxy/baggageHeaderUtils.ts
Outdated
Show resolved
Hide resolved
| expect(logSpy).not.toHaveBeenCalled(); | ||
| }); | ||
|
|
||
| it('should percent-encode spaces and non-ASCII characters in values', () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
probably not super important, but I quickly tried you branch and added a test:
it('test', () => {
const entries = new Set([
'traceId=abc123;sampled=true;debug',
'test1= this is a test'
]);
const result = formatBaggageHeader(entries);
expect(result).toBe(
'traceId=abc123;sampled=true;debug,test1=this%20is%20a%20test'
);
});
however I believe the correct result should be:
'traceId=abc123;sampled=true;debug,test1=%20this%20is%20a%20test'
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for trying it out 🙏 However, the result is correct, as keys and values are trimmed on purpose.
In the W3 spec:
baggage-string = list-member 0*179( OWS "," OWS list-member )
list-member = key OWS "=" OWS value *( OWS ";" OWS property )
property = key OWS "=" OWS value
Where OWS stands for "optional whitespace".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Look good.
32d7885
What does this PR do?
When a RUM Session ID is available, we set it in the
Baggageheader of intercepted network requests when usingtrackResources=true.We don't account for pre-existing values in the
Baggageheader, so we end up overwriting it.This PR adds support for user-defined
Baggageheaders by using comma-separated list strings, following the W3C Baggage specification.Requirements for W3 compliance
Entry Format
Each entry must contain at least one = separating key and value.
Key Validation
Keys must follow RFC 7230 §3.2.6 token grammar.
Allowed characters:
!#$%&'*+-.^_|~0-9A-Za-zValue Encoding
Values are UTF-8 encoded.
Characters outside the allowed baggage octet range (
!, #–+, -–:, <–[, ]–~) are percent-encoded.Spaces, commas, semicolons, quotes, backslashes, and non-ASCII characters are encoded.
Example:
Properties (Metadata)
Entries may include properties separated by semi-colons:
Property keys must also follow RFC 7230 token grammar.
Property values are percent-encoded using the same rules as the main value.
Whitespace Handling
Leading and trailing whitespace around keys, values, and properties is trimmed.
Internal whitespace (e.g. "foo = bar ; p1 = one") is normalized.
Limits (per W3C Spec §3.3.2)
The resulting header must contain:
≤ 64 list-members, otherwise a warning is logged.
≤ 8192 bytes total size, otherwise a warning is logged.
Entries beyond these limits may be ignored by consumers. We print a warning on our side, without dropping the entry.
Order Preservation
Entries are formatted in the same order they appear in the original Set.
Logging and Error Handling
Invalid entries and properties are not propagated.
Each failure is logged via InternalLog with
SdkVerbosity.WARN.Review checklist (to be filled by reviewers)